使用js根据标签获取文章目录 发表于 2020-07-27 | 更新于 2023-01-11 使用js根据标签获取文章目录 使用递归重写文章侧边栏目录生成方法 js代码123456789101112131415161718192021222324252627282930313233343536373839404142434445// 获取H标签等级const getLevel = item => (item.match(/<h(\d+)/) || [])[1];// 获取H标签内容const getText = item => item.replace(/<[^>]+>/g, "");// 获取目录htmlfunction getTocHtml(html) { const data = (html.match(/<h[1-6](.*)?<\/h[1-6]>/g) || []).map(item => ({ text: getText(item), level: getLevel(item) })); let i = 0; // 循环下标 const getLiText = text => { const href = `toc-link-${i}`; return `\n<li><a name="link" class="toc-link ${href}" href="#${href}">${text}</a></li>\n`; }; const getULText = text => (text ? `<ul class="toc-list">${text}</ul>\n` : ""); function createInner(item, data) { let str = getLiText(item.text); while (data.length && data[0].level >= item.level) { i += 1; const it = data.shift(); if (it.level === item.level) { // 添加一个li str += getLiText(it.text); } else { // 添加li内的ul str += createInner(it, data); } } return getULText(str); } // 防止出现先小等级标签在大等级标签下边的情况 let resStr = '' while (data.length) { resStr += createInner(data.shift(), data) i += 1 } return resStr}export default getTocHtml;